﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using CrossesGrav;
using CrossesGrav.WorkClasses;

namespace CrossesGrav.GameLogic // Класс, описывающий игрока. Содержит основные переменные, методы.
{
    abstract class Player
    {
        public bool side;// true - крестик. false - нолик.
        public string name;
        public bool moving;
        public bool can_click = false;
        public bool winner = false;
        public int u;
        public List<Cell> Cells;
        public Cell LastCell;
        public struct Data
        {
            public Cell WCells;
            public List<bool> Nearly;
            public List<bool> Windws;
            public List<float> Counts;
            public List<int> FreeCells;

        }

        abstract public void Move(int z); // Метод, в котором осущестляется ход. Переопределяется в разных вариантах потомков. Позволяет задать разную стратегию разным типам игроков.

        protected bool CompareStat(Cell t1, Cell t2) // Метод, сравнивающий 2 клетки.
        {
            if (
                 (t1.stat.Acessibility == t2.stat.Acessibility)
                 &&
               (t1.stat.Circle == t2.stat.Circle)
               &&
               (t1.stat.Cross == t2.stat.Cross)
               &&
               (t1.stat.Free == t2.stat.Free)
               )
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public bool CheckForWin(Cell t)
        {
          //  List<int> numbers = new List<int>();
            List<int> Counts = new List<int>();
            Cell WatchTo = t;
            for (int z = 0; z < t.SideList.Count; z++)
            {
                Counts.Add(0);
                while (true)
                {
                    try
                    {
                        if (CompareStat(WatchTo.SideList[z], WatchTo))
                        {
                            Counts[z]++;

                            WatchTo = WatchTo.SideList[z];
                       }
                        else
                        {
                            WatchTo = t; 
                            break;
                        }
                    }
                    catch
                    {
                        WatchTo = t;
                        break;
                    }
                }
            }
            if (Counts[0] + Counts[4] >= Game.forWin - 1)
            {
                Win_Marker(t, 0, Counts[0]);
                Win_Marker(t, 4, Counts[4]);
                return true;
            }
            else
            if (Counts[1] + Counts[5] >= Game.forWin - 1)
            {
                Win_Marker(t, 1, Counts[1]);
                Win_Marker(t, 5, Counts[5]);
                return true;
            }
            else
            if (Counts[2] + Counts[6] >= Game.forWin - 1)
            {
                Win_Marker(t, 2, Counts[2]);
                Win_Marker(t, 6, Counts[6]);
                return true;

            }
            else
            if (Counts[3] >= Game.forWin - 1)
            {
                Win_Marker(t, 3, Counts[3]);
                return true;
                
            }
            else return false;
        }

        private void Win_Marker(Cell t, int way, int Count)
        {
            Cell temp;
            Graphics surface;// = Graphics.FromImage(t.Box.Image);
            SolidBrush b = new SolidBrush(Color.FromArgb(100, 241, 225, 163));
            Bitmap t_bit;
            temp = t;

            for (int i = 0; i <= Count; i++ )
            {
                t_bit = new Bitmap(temp.Box.Image,temp.Box.Width,temp.Box.Height);
                surface = Graphics.FromImage(t_bit);
                //temp.Box.Image = Game.images["Cross_Win"];
                surface.FillRectangle(b, new Rectangle(0,0,Program.f.w,Program.f.h));
                temp.Box.Image = t_bit;
                temp = temp.SideList[way];
            }
            //return t.Box.Image;
        }

        private bool CompareStat(Cell.Status status, Cell.Status status_2) // Впринципе ненужный кусок кода. Заготовка для метода, который будет сравнивать сразу статусы клеток. На случай, если будут проблемы с производительностью.
        {
            throw new NotImplementedException();
        }

    }
}
